Spring Framework ডাটাবেস অপারেশন পরিচালনার জন্য দুটি ধরনের Transaction Management সরবরাহ করে:
- Declarative Transaction Management
- Programmatic Transaction Management
Spring JDBC-এর সাহায্যে ট্রানজেকশন পরিচালনা করার জন্য এই দুটি পদ্ধতি ব্যবহার করা যায়। এদের মধ্যে Declarative Transaction Management বেশি ব্যবহৃত হয় কারণ এটি সহজ এবং ক্লিন কোড প্রদান করে।
1. Declarative Transaction Management
Declarative Transaction Management হলো Spring-এর AOP (Aspect-Oriented Programming) ভিত্তিক একটি পদ্ধতি, যেখানে ট্রানজেকশন ম্যানেজমেন্ট কনফিগারেশনের মাধ্যমে সম্পন্ন করা হয়। এতে কোনো এক্সপ্লিসিট (স্পষ্ট) কোড লেখা লাগে না।
কীভাবে কাজ করে?
- Spring
@Transactionalঅ্যানোটেশন ব্যবহার করে ডাটাবেস অপারেশনগুলোকে ট্রানজেকশনাল করতে পারে। - ডিফল্টভাবে Spring AOP এই অ্যানোটেশনের মাধ্যমে ট্রানজেকশন শুরু, কমিট, বা রোলব্যাক পরিচালনা করে।
ব্যবহারের ধাপসমূহ:
1. Dependency যোগ করা
Spring Transaction Management-এর জন্য প্রয়োজনীয় ডিপেনডেন্সি যোগ করুন:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>RELEASE</version>
</dependency>
2. কনফিগারেশন:
Java-based Configuration:
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@EnableTransactionManagement
public class AppConfig {
// DataSource এবং JdbcTemplate Bean ডিফাইন করুন
}
3. @Transactional অ্যানোটেশন ব্যবহার করা:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class EmployeeService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Transactional
public void addEmployee(String name, String department) {
String sql1 = "INSERT INTO employees (name, department) VALUES (?, ?)";
jdbcTemplate.update(sql1, name, department);
// Intentional Exception for Testing Rollback
if (department.equals("INVALID")) {
throw new RuntimeException("Invalid Department");
}
String sql2 = "UPDATE department_stats SET employee_count = employee_count + 1 WHERE department = ?";
jdbcTemplate.update(sql2, department);
}
}
রোলব্যাক এবং কমিট:
- যদি একটি এক্সসেপশন থ্রো হয়, তবে Spring ট্রানজেকশন রোলব্যাক করবে।
- এক্সসেপশন ছাড়া সফল হলে কমিট করবে।
2. Programmatic Transaction Management
Programmatic Transaction Management-এ ট্রানজেকশন ম্যানেজমেন্ট ম্যানুয়ালি কোডের মাধ্যমে পরিচালনা করা হয়। এটি যখন অত্যন্ত নিয়ন্ত্রণের প্রয়োজন হয় তখন ব্যবহার করা হয়।
কীভাবে কাজ করে?
- Spring এর
PlatformTransactionManagerএবংTransactionTemplateব্যবহার করে ট্রানজেকশন শুরু, কমিট, এবং রোলব্যাক ম্যানুয়ালি হ্যান্ডেল করা হয়।
ব্যবহারের ধাপসমূহ:
1. TransactionTemplate ব্যবহার করা:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
@Service
public class EmployeeService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private PlatformTransactionManager transactionManager;
public void addEmployee(String name, String department) {
TransactionDefinition def = new DefaultTransactionDefinition();
TransactionStatus status = transactionManager.getTransaction(def);
try {
String sql1 = "INSERT INTO employees (name, department) VALUES (?, ?)";
jdbcTemplate.update(sql1, name, department);
if (department.equals("INVALID")) {
throw new RuntimeException("Invalid Department");
}
String sql2 = "UPDATE department_stats SET employee_count = employee_count + 1 WHERE department = ?";
jdbcTemplate.update(sql2, department);
// Commit transaction
transactionManager.commit(status);
} catch (Exception ex) {
// Rollback transaction
transactionManager.rollback(status);
throw ex;
}
}
}
ব্যাখ্যা:
DefaultTransactionDefinition: ট্রানজেকশন প্রপার্টি সেট করতে ব্যবহৃত হয়।transactionManager.getTransaction(def): একটি নতুন ট্রানজেকশন শুরু করে।transactionManager.commit(status): সফল হলে ট্রানজেকশন কমিট করে।transactionManager.rollback(status): কোনো এক্সসেপশন ঘটলে রোলব্যাক করে।
Declarative vs Programmatic Transaction Management
| প্যারামিটার | Declarative | Programmatic |
|---|---|---|
| সহজতা | খুবই সহজ এবং ক্লিন কোড। | বেশি কোড লাগে এবং ম্যানুয়াল হ্যান্ডলিং প্রয়োজন। |
| ব্যবহারযোগ্যতা | সাধারণত বেশিরভাগ ক্ষেত্রে ব্যবহৃত হয়। | শুধুমাত্র বিশেষ পরিস্থিতিতে প্রয়োজন হয়। |
| রোলব্যাক এবং কমিট | Spring নিজেই পরিচালনা করে। | ডেভেলপারকে ম্যানুয়ালি পরিচালনা করতে হয়। |
| কনফিগারেশন প্রয়োজনীয়তা | @Transactional অ্যানোটেশন এবং কনফিগারেশন যথেষ্ট। | PlatformTransactionManager প্রয়োজন। |
| কাস্টমাইজেশন | সীমিত কাস্টমাইজেশন। | সম্পূর্ণ কাস্টমাইজেশন সম্ভব। |
যখন Declarative ব্যবহার করবেন:
- সাধারণ ডাটাবেস অ্যাক্সেস এবং ট্রানজেকশন ম্যানেজমেন্টের জন্য।
- কমপ্লেক্সিটি কমিয়ে সহজ ও ক্লিন কোড রচনা করার জন্য।
যখন Programmatic ব্যবহার করবেন:
- জটিল ট্রানজেকশন ম্যানেজমেন্ট যেখানে একাধিক ট্রানজেকশন কনটেক্সট হ্যান্ডল করা প্রয়োজন।
- বিশেষ নিয়ন্ত্রণ প্রয়োজন হলে।
Spring JDBC-তে Declarative Transaction Management অধিক ব্যবহৃত হয় কারণ এটি কম কোডে কার্যকরী সমাধান প্রদান করে। তবে Programmatic Transaction Management ব্যবহার করতে হয় যখন বিশেষ পরিস্থিতিতে কাস্টম নিয়ন্ত্রণ দরকার হয়।
Read more